package utils

import "reflect"

//source 有数据的结构体
//复制字段值的目标结构体
func StructCopy(source, target interface{}) {
	//传入指针类型才可以修改字段属性
	//通过Elem()方法获得对对象的指向
	sv := reflect.ValueOf(source).Elem()
	tv := reflect.ValueOf(target).Elem()
	//获取源结构体的reflect.Type类型，根据字段名进行匹配
	svTp := sv.Type()
	for i := 0; i < sv.NumField(); i++ {
		//获取每个字段的名字
		name := svTp.Field(i).Name
		//根据字段名字获取字段的值，若有则该字段匹配
		if tv.FieldByName(name).IsValid() {
			tv.FieldByName(name).Set(sv.Field(i))
		}
	}
}
